namespace BepuUtilities.Memory
{
    /// <summary>
    /// 定义能够池化非托管内存块的类型。
    /// </summary>
    public interface IUnmanagedMemoryPool
    {
        /// <summary>
        /// 获取足够大的缓冲区,以包含多个给定类型的元素。容量可能大于请求的容量。
        /// </summary>
        /// <typeparam name="T">缓冲区中元素的类型。</typeparam>
        /// <param name="count">所需的类型化元素中缓冲区的最小容量。</param>
        /// <param name="buffer">缓冲区大小足以包含请求的元素数。</param>
        void TakeAtLeast<T>(int count, out Buffer<T> buffer) where T : unmanaged;
        /// <summary>
        /// 从池中获取请求大小的类型化缓冲区。
        /// </summary>
        /// <typeparam name="T">缓冲区中实例的类型。</typeparam>
        /// <param name="count">类型化元素中缓冲区的所需容量。</param>
        /// <param name="buffer">键入的请求大小的缓冲区。</param>
        void Take<T>(int count, out Buffer<T> buffer) where T : unmanaged;
        /// <summary>
        /// 将缓冲区返回到池。
        /// </summary>
        /// <typeparam name="T">缓冲区元素的类型。</typeparam>
        /// <param name="buffer">返回池的缓冲区。</param>
        void Return<T>(ref Buffer<T> buffer) where T : unmanaged;
        /// <summary>
        /// 获取如果从TakeAtLeast请求给定的元素计数,池将返回的缓冲区的容量。
        /// </summary>
        /// <typeparam name="T">正在请求的元素的类型。</typeparam>
        /// <param name="count">要请求的元素数。</param>
        /// <return>请求给定元素计数时将返回的缓冲区容量。</return>
        int GetCapacityForCount<T>(int count) where T : unmanaged;
    }
}
